package A_sort;

public class Swap {

    public static void swap(int[] arr,int biggerIndex,int smallerIndex){
        int temp = arr[biggerIndex];
        arr[biggerIndex] = arr[smallerIndex];
        arr[smallerIndex] = temp;
    }

    /**
     * 异或运算  按位 相同为1  不同为0
     * 还可以理解为 没有进位的相加
     * 性质 1 : 0^N = N ,N^N = 0
     *     2 : 满足交换律和结合律  a^b^c = a^(b^c)  a^b=b^a (为什么？)
     *     3 : 同样一批数 无论顺序 异或运算结果始终相同
     * @param indexI
     * @param indexJ
     * @param arr
     * @notice 这种方法只能应用于 两个要交换的变量都有独立的内存 如果是相同的内存地址则会有问题（什么问题？）  相同位置 就是 a^a = 0 ;0^0 =0 ;0^0 =0 总是洗成0
     */
    public static void swap(int indexI,int indexJ,int[] arr){
        //arr[indexI] = a ; arr[indexJ] = b;
        arr[indexI] = arr[indexI] ^ arr[indexJ];
        //上面代码简化为
        // a = a^b

        arr[indexJ] = arr[indexI] ^ arr[indexJ];
        //上面代码简化为
        // b = a^b
        // b = (a^b)^b;
        // b = a^(b^b);
        // b = a^0;
        // b = a;

        arr[indexI] = arr[indexI] ^ arr[indexJ];
        // 同理
    }
}
